/**
 * 研发流程状态机 - 文档类型配置
 * 根据研发流程状态机.md文档实现
 */

/**
 * 文档类型定义
 */
const DOCUMENT_TYPES = {
  // 需求和计划文档
  REQUIREMENT: 'requirement',          // 需求文档
  PLAN: 'plan',                        // 项目计划
  
  // 硬件文档
  SCHEMATIC: 'schematic',            // 原理图
  PCB: 'pcb',                        // PCB设计文件
  GERBER: 'gerber',                  // Gerber文件
  BOM: 'bom',                        // BOM清单
  HARDWARE_SPEC: 'hardware_spec',    // 硬件规格书
  
  // 软件文档+
  SOURCE_CODE: 'source_code',        // 源代码
  FIRMWARE: 'firmware',              // 固件
  SOFTWARE_SPEC: 'software_spec',    // 软件规格书
  SOFTWARE_CODE: 'software_code',    // 软件代码
  
  // 测试文档
  TEST_PLAN: 'test_plan',            // 测试计划
  TEST_REPORT: 'test_report',        // 测试报告
  BUG_LIST: 'bug_list',              // BUG列表
  
  // 生产文档
  ASSEMBLY_GUIDE: 'assembly_guide',  // 装配指导
  QUALITY_STANDARD: 'quality_standard', // 质量标准
  INSPECTION_REPORT: 'inspection_report', // 检验报告
  PACKING_SPEC: 'packing_spec',      // 包装规范
  PRODUCTION_DOCS: 'production_docs', // 生产文档
  
  // 样品文档
  SAMPLE_REPORT: 'sample_report',     // 样品报告
  
  // 用户文档
  USER_MANUAL: 'user_manual',        // 用户手册
  
  // 流程文档
  SLEEP_REASON: 'sleep_reason',      // 休眠原因说明
  WAKEUP_REASON: 'wakeup_reason',    // 唤醒申请说明
  REDESIGN_REASON: 'redesign_reason' // 重新设计申请
};

/**
 * 文档类型名称映射
 */
const DOCUMENT_TYPE_NAMES = {
  [DOCUMENT_TYPES.REQUIREMENT]: '需求文档',
  [DOCUMENT_TYPES.PLAN]: '项目计划',
  [DOCUMENT_TYPES.SCHEMATIC]: '原理图',
  [DOCUMENT_TYPES.PCB]: 'PCB设计文件',
  [DOCUMENT_TYPES.GERBER]: 'Gerber文件',
  [DOCUMENT_TYPES.BOM]: 'BOM清单',
  [DOCUMENT_TYPES.HARDWARE_SPEC]: '硬件规格书',
  [DOCUMENT_TYPES.SOURCE_CODE]: '源代码',
  [DOCUMENT_TYPES.FIRMWARE]: '固件',
  [DOCUMENT_TYPES.SOFTWARE_SPEC]: '软件规格书',
  [DOCUMENT_TYPES.SOFTWARE_CODE]: '软件代码',
  [DOCUMENT_TYPES.TEST_PLAN]: '测试计划',
  [DOCUMENT_TYPES.TEST_REPORT]: '测试报告',
  [DOCUMENT_TYPES.BUG_LIST]: 'BUG列表',
  [DOCUMENT_TYPES.ASSEMBLY_GUIDE]: '装配指导',
  [DOCUMENT_TYPES.QUALITY_STANDARD]: '质量标准',
  [DOCUMENT_TYPES.INSPECTION_REPORT]: '检验报告',
  [DOCUMENT_TYPES.PACKING_SPEC]: '包装规范',
  [DOCUMENT_TYPES.PRODUCTION_DOCS]: '生产文档',
  [DOCUMENT_TYPES.SAMPLE_REPORT]: '样品报告',
  [DOCUMENT_TYPES.USER_MANUAL]: '用户手册',
  [DOCUMENT_TYPES.SLEEP_REASON]: '休眠原因说明',
  [DOCUMENT_TYPES.WAKEUP_REASON]: '唤醒申请说明',
  [DOCUMENT_TYPES.REDESIGN_REASON]: '重新设计申请'
};

/**
 * 文档类型分组
 */
const DOCUMENT_GROUPS = {
  REQUIREMENT: '需求文档',
  HARDWARE: '硬件文档',
  SOFTWARE: '软件文档',
  TEST: '测试文档',
  PRODUCTION: '生产文档',
  USER: '用户文档',
  PROCESS: '流程文档'
};

/**
 * 文档类型分组配置
 */
const DOCUMENT_TYPE_GROUPS = {
  [DOCUMENT_GROUPS.REQUIREMENT]: [
    DOCUMENT_TYPES.REQUIREMENT,
    DOCUMENT_TYPES.PLAN
  ],
  [DOCUMENT_GROUPS.HARDWARE]: [
    DOCUMENT_TYPES.SCHEMATIC,
    DOCUMENT_TYPES.PCB,
    DOCUMENT_TYPES.GERBER,
    DOCUMENT_TYPES.BOM,
    DOCUMENT_TYPES.HARDWARE_SPEC
  ],
  [DOCUMENT_GROUPS.SOFTWARE]: [
    DOCUMENT_TYPES.SOURCE_CODE,
    DOCUMENT_TYPES.FIRMWARE,
    DOCUMENT_TYPES.SOFTWARE_SPEC,
    DOCUMENT_TYPES.SOFTWARE_CODE
  ],
  [DOCUMENT_GROUPS.TEST]: [
    DOCUMENT_TYPES.TEST_PLAN,
    DOCUMENT_TYPES.TEST_REPORT,
    DOCUMENT_TYPES.BUG_LIST
  ],
  [DOCUMENT_GROUPS.PRODUCTION]: [
    DOCUMENT_TYPES.ASSEMBLY_GUIDE,
    DOCUMENT_TYPES.QUALITY_STANDARD,
    DOCUMENT_TYPES.INSPECTION_REPORT,
    DOCUMENT_TYPES.PACKING_SPEC,
    DOCUMENT_TYPES.PRODUCTION_DOCS,
    DOCUMENT_TYPES.SAMPLE_REPORT
  ],
  [DOCUMENT_GROUPS.USER]: [
    DOCUMENT_TYPES.USER_MANUAL
  ],
  [DOCUMENT_GROUPS.PROCESS]: [
    DOCUMENT_TYPES.SLEEP_REASON,
    DOCUMENT_TYPES.WAKEUP_REASON,
    DOCUMENT_TYPES.REDESIGN_REASON
  ]
};

/**
 * 获取文档类型名称
 * @param {String} documentType 文档类型
 * @returns {String} 文档类型名称
 */
function getDocumentTypeName(documentType) {
  return DOCUMENT_TYPE_NAMES[documentType] || documentType;
}

/**
 * 获取指定分组的文档类型
 * @param {String} groupName 分组名称
 * @returns {Array} 文档类型数组
 */
function getDocumentTypesByGroup(groupName) {
  return DOCUMENT_TYPE_GROUPS[groupName] || [];
}

/**
 * 获取文档类型所属分组
 * @param {String} documentType 文档类型
 * @returns {String} 分组名称
 */
function getDocumentTypeGroup(documentType) {
  for (const [group, types] of Object.entries(DOCUMENT_TYPE_GROUPS)) {
    if (types.includes(documentType)) {
      return group;
    }
  }
  return null;
}

/**
 * 事件所需文档配置
 * 定义每个事件需要上传的文档类型
 */
const EVENT_REQUIRED_DOCUMENTS = {
  // 硬件设计提交需要上传硬件设计文档
  'design_submit': [
    DOCUMENT_TYPES.SCHEMATIC,
    DOCUMENT_TYPES.PCB,
    DOCUMENT_TYPES.BOM,
    DOCUMENT_TYPES.HARDWARE_SPEC
  ],
  
  // 软件开发提交需要上传软件相关文档
  'software_submit': [
    DOCUMENT_TYPES.SOURCE_CODE,
    DOCUMENT_TYPES.FIRMWARE,
    DOCUMENT_TYPES.SOFTWARE_SPEC
  ],
  
  // 测试完成需要上传测试报告
  'test_complete': [
    DOCUMENT_TYPES.TEST_REPORT
  ],
  
  // 样品申请需要上传生产相关文档
  'sample_apply': [
    DOCUMENT_TYPES.GERBER,
    DOCUMENT_TYPES.BOM,
    DOCUMENT_TYPES.ASSEMBLY_GUIDE
  ],
  
  // 休眠申请需要上传休眠原因说明
  'sleep_request': [
    DOCUMENT_TYPES.SLEEP_REASON
  ],
  
  // 唤醒申请需要上传唤醒原因说明
  'wakeup_request': [
    DOCUMENT_TYPES.WAKEUP_REASON
  ],
  
  // 重新设计申请需要上传重新设计原因
  'redesign_request': [
    DOCUMENT_TYPES.REDESIGN_REASON
  ]
};

/**
 * 获取事件所需文档类型
 * @param {String} eventCode 事件编码
 * @returns {Array} 文档类型数组
 */
function getRequiredDocumentsByEvent(eventCode) {
  return EVENT_REQUIRED_DOCUMENTS[eventCode] || [];
}

/**
 * 导出文档相关功能
 */
module.exports = {
  DOCUMENT_TYPES,
  DOC_TYPES: DOCUMENT_TYPES, // 别名，用于兼容性
  DOCUMENT_TYPE_NAMES,
  DOCUMENT_GROUPS,
  DOCUMENT_TYPE_GROUPS,
  EVENT_REQUIRED_DOCUMENTS,
  getDocumentTypeName,
  getDocumentTypesByGroup,
  getDocumentTypeGroup,
  getRequiredDocumentsByEvent,
  getDocTypeName: getDocumentTypeName // 别名，用于兼容性
}; 